<?php

Yii::import('application.modules.nosey.models._base.BaseNoseyEntidadAnswer');

class NoseyEntidadAnswer extends BaseNoseyEntidadAnswer {

    public $date_first;
    public $date_last;

    /**
     * @return NoseyEntidadAnswer
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    public static function label($n = 1) {
        return Yii::t('app', 'NoseyEntidadAnswer|NoseyEntidadAnswers', $n);
    }

    public function relations() {
        return array_merge(parent::relations(), array(
            'answers' => array(self::HAS_ONE, 'Answer', array('entity_id' => 'id')),
            'form' => array(self::BELONGS_TO, 'Form', 'nosey_form_id'),
            'contactorel' => array(self::BELONGS_TO, 'Contacto', 'contacto'),
        ));
    }

    /*
     * Consulta para recuperar la encuesta de un usuario
     * select na.creation_date, nf.name from nosey_entidad_answer nea
      inner join nosey_form nf on nea.nosey_form_id = nf.id
      inner join nosey_section ns on nf.id = ns.form_id
      inner join nosey_field nfield on ns.id = nfield.section_id
      inner join nosey_field_value nfv on nfield.id = nfv.field_id
      inner join nosey_answer na on nfv.answer_id = na.id
      where nea.contacto = 1805
      group by na.id
     */

    public function searchByContacto($contacto) {
        $criteria = new CDbCriteria;

        $criteria->join = 'INNER JOIN nosey_form ON nosey_form.id = t.nosey_form_id';
        $criteria->join = 'INNER JOIN nosey_answer ON nosey_answer.entity_id = t.id';

        $criteria->addCondition('t.contacto=:contacto', 'AND');
        $Params = array(
            ':contacto' => $contacto);
        $criteria->params = array_merge($criteria->params, $Params);
        $criteria->order = 'nosey_answer.id DESC';
        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            "pagination" => array(
                "pageSize" => 5  //colocar mayores a 4 ya que no se activa el scroll de css debido a el ancho del div que depende de la cantidad de objetos que tenga incluidos
            )
        ));
    }

    public function fomularioRespuesta($section, $respuesta) {
        $info = array();
        $general = array();
        $att = array();
        $info['id'] = 1;
        $answer;
        foreach ($section->fields as $field):
            $resp = $this->obtenerRespuesta($respuesta->id, $field->id);
            if ($resp) {
                $info[$field->id] = $resp;

                array_push($att, array('name' => $field->id, 'label' => $field->label));
            } else {
                $info['error'] = 'No tiene respuestas para este formulario.';
                array_push($att, array('name' => 'error', 'label' => ( "<span class='label label-warning'><i class = 'icon-warning-sign'></i>  Nota :</span>"), 'type' => 'html'));
            }

        endforeach;
        $general['data'] = $info;
        $general['attributes'] = $att;
        return $general;
    }

    public function de_entidad($entidad_tipo, $entidad_id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 'entidad_tipo =:entidad_tipo AND entidad_id = :entidad_id ',
                    'params' => array(
                        ':entidad_id' => $entidad_id,
                        ':entidad_tipo' => $entidad_tipo
                    ),
                )
        );
        return $this;
    }

    public function obtenerRespuesta($answer_id, $field_id) {

        $respuesta = FieldValue::model()->findByAttributes(array("answer_id" => $answer_id, "field_id" => $field_id));
        if ($respuesta) {
            switch ($respuesta->field->field_type) {
                case 2:
                    $answer = Option::model()->findByPk($respuesta->content)->label;
                    break;
                case 3:
                    $opciones = json_decode($respuesta->content);
                    $answer = '';
                    foreach ($opciones as $opcion) {
                        $answer .= Option::model()->findByPk($opcion)->label . ', ';
                    }
                    $answer = substr($answer, 0, -2);
                    break;
                case 4:
                    $answer = $respuesta->content == 0 ? 'No' : 'Si';
                    break;
                default:
                    $answer = $respuesta->content;
                    break;
            }
            return $answer;
        } else {
            return "";
        }
    }

    public function obtenerPreguntas($form_id) {
        $formulario = Form::model()->findByPk($form_id);
        $pregunta = array();
        if ($formulario) {
            foreach ($formulario->sections as $sections) {
                foreach ($sections->fields as $field) {
                    array_push($pregunta, array("field_id" => $field->id, "label" => Util::Truncate($field->label,25)));
                }
            }
        }

        return $pregunta;
    }

    public function createGrid($form_id) {
        $grid = array();
        foreach ($this->obtenerPreguntas($form_id) as $pregunta) {
            array_push($grid, array(
                'header' => $pregunta['label'],
                'value' => '$data->obtenerRespuesta($data->answers->id,' . $pregunta['field_id'] . ')',
            ));
        }

        return $grid;
    }

    public function search() {
        $criteria = new CDbCriteria;
        $criteria->with = array(
            'answers',
        );
        $criteria->compare('t.id', $this->id);
        $criteria->compare('t.entidad_tipo', $this->entidad_tipo, true);
        $criteria->compare('t.entidad_id', $this->entidad_id);
        $criteria->compare('t.subentidad_tipo', $this->subentidad_tipo, true);
        $criteria->compare('t.subentidad_id', $this->subentidad_id);
        $criteria->compare('t.contacto', $this->contacto);
        $criteria->compare('t.nosey_form_id', $this->nosey_form_id);
//        $criteria->compare('answers.creation_date', $this->creation_date);
        if ((isset($this->date_first) && trim($this->date_first) != "") && (isset($this->date_last) && trim($this->date_last) != ""))
            $criteria->addBetweenCondition('answers.creation_date', '' . Util::FormatDate($this->date_first, "Y-m-d") . ' 00:00:00', '' . Util::FormatDate($this->date_last, "Y-m-d") . ' 23:59:59');


        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    /**
     * function que realiza la consulta de los sms dentro del intervalo de las fechas dadas
     * @param string $fechaIni intervalo de la fecha inicial para los formularios
     * @param string $fechaFin intervalo de la fecha final para los formularios
     * @return formularios 
     */
    public function rango($fechaIni, $fechaFin) {
        $fechaIni = Util::FormatDate($fechaIni, 'Y-m-d 00:00:00');
        $fechaFin = Util::FormatDate($fechaFin, 'Y-m-d 23:59:59');
        $this->getDbCriteria()->mergeWith(
                array(
                    'join' => 'INNER JOIN nosey_answer ON nosey_answer.entity_id = t.id',
                    'condition' => 'nosey_answer.creation_date BETWEEN :fechaIni AND :fechaFin',
                    
                    'params' => array(
                        ":fechaIni" => $fechaIni,
                        ":fechaFin" => $fechaFin,
                    ),
                    'order' => 'nosey_answer.creation_date DESC'
                )
        );
        return $this;
    }

    public function de_formulario_id($formulario_id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.nosey_form_id =:form_id',
                    'params' => array(
                        ':form_id' => $formulario_id,
                    ),
                )
        );
        return $this;
    }
    public function de_entidad_id($entidad_id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.entidad_id =:entidad_id',
                    'params' => array(
                        ':entidad_id' => $entidad_id,
                    ),
                )
        );
        return $this;
    }
    public function de_entidad_tipo($entidad_tipo) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.entidad_tipo =:entidad_tipo',
                    'params' => array(
                        ':entidad_tipo' => $entidad_tipo,
                    ),
                )
        );
        return $this;
    }

    public function scopes() {
        return array(
            'fecha_mas_reciente' => array(
                'order' => 't.id DESC',
            ),
        );
    }

}
